home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / eulisp / mpfeel.lha / MPFeel / Modules / list-fns.em < prev    next >
Lisp/Scheme  |  1992-10-06  |  2KB  |  112 lines

  1. (defmodule list-fns
  2.   (standard0)
  3.   ()
  4.   ;;
  5.   ;;  (union (expose  arith others ccc vectors defs
  6.   ;;          extras0 macros0  lists list-operators)    
  7.   ;;(except (null vector) (expose class-names)))
  8.  
  9.   ;; Useful function not defined EulispLISP
  10.   (defun deleq (a b)
  11.     (cond
  12.      ((null b) nil)
  13.      ((eq a (car b))
  14.       (cdr b))
  15.      (t (cons (car b) (deleq a (cdr b)))) ))
  16.  
  17.   (defun mapcdr (fn lst)
  18.     (cond ((null lst) (fn nil))
  19.       ((atom lst) (fn lst))
  20.       (t (cons (fn lst)
  21.            (mapcdr fn (cdr lst))))))
  22.  
  23.   (export mapcdr)
  24.     
  25.   
  26. ;;  (defun map-all (fn lst)
  27. ;;    (cond ((null lst) nil)
  28. ;;          ((atom lst) lst)
  29. ;;      ((consp (car lst))
  30. ;;       (cons (map-all fn (car lst))
  31. ;;         (map-all fn (cdr lst))))
  32. ;;      (t (cons (fn (car lst))
  33. ;;           (map-all fn (cdr lst))))))
  34.  
  35.   (defun map-all (fn lst)
  36.     (if (atom lst) (fn lst)
  37.       (mapcar map-all lst)))
  38.  
  39.   (defun fold (fn lst init)
  40.     (cond ((null lst) init)
  41.       (t (fold fn (cdr lst) 
  42.            (fn (car lst) init)))))
  43.  
  44.   (defun mapvect (fn vect)
  45.     (mapvect-aux fn (vector-length vect) (make-vector (vector-length vect) nil) vect))
  46.  
  47.   ;; work in RL direction (for peversity)
  48.   (defun mapvect-aux (fn i new-v old-v)
  49.     (cond ((zerop i) new-v)
  50.       (t ((setter vector-ref) new-v (- i 1) (fn (vector-ref old-v (- i 1))))
  51.          (mapvect-aux fn (- i 1) new-v old-v))))
  52.  
  53.  (defun collect (p l)
  54.     (cond ((null l) nil)
  55.       ((p (car l))
  56.        (cons (car l)
  57.          (collect p (cdr l))))
  58.       (t (collect p (cdr l)))))
  59.  
  60.  (defun detect (p l)
  61.    (cond ((null l) ())
  62.      ((p (car l)))
  63.      (t (detect p (cdr l)))))
  64.  
  65.  (defun posnq (thing l)
  66.    (let ((count 0))
  67.      (detect (lambda (ob)
  68.            (if (eq ob thing)
  69.            count
  70.          (progn (setq count (+ 1 count))
  71.             nil)))
  72.          l)))
  73.  (export posnq)
  74.  
  75.  (defun nthcdr (n list)
  76.    (cond ((= n 0) list)
  77.      (t (nthcdr (- n 1) (cdr list)))))
  78.  
  79.  (defun nth (n list)
  80.    (car (nthcdr n list)))
  81.  
  82.  (export nthcdr)
  83.  (defun mk-finder ()
  84.    (let* ((table (make-table eq))
  85.       (fn (lambda (x) (table-ref table x))))
  86.      ((setter setter) fn 
  87.       (lambda (x v) 
  88.     ((setter table-ref) table x v)))
  89.      fn))
  90.  
  91.  
  92.  (defun mk-counter (n)
  93.    (let ((v n))
  94.      (lambda ()
  95.        ((lambda (a)
  96.       (setq v (+ v 1))
  97.       a)
  98.     v))))
  99.   
  100.  
  101.  (defun local-var (x)
  102.    (let ((val x))
  103.      (let ((fn (lambda () val))
  104.        (set-fn (lambda (x) (setq val x) nil)))
  105.        ((setter setter) fn set-fn)
  106.        fn)))
  107.  
  108.  (export mapvect fold  map-all deleq collect detect nth mk-finder mk-counter local-var)
  109.  
  110.  
  111.